<?php

/**
 * Lớp cơ sở cho các controller
 */
class Controller
{
    protected $_model;
    protected $_action;
    protected $_view;
    protected $_controller;
    protected $_ignoreMaster = false;
    protected $_render = true;

    public function __construct($action, $useModel = true, $render = true)
    {
        $this->_render = $render;

        $this->_action = $action;
        preg_match('/(\w+)Controller/', get_class($this), $match);
        $this->_controller = $match[1];
        # khởi tạo Model
        if ($useModel) {
            if (class_exists($this->_controller)) {
                $this->_model = new $this->_controller;
                $this->{$this->_controller} =& $this->_model;
            } else {
                throw new Exception("Model [{$this->_controller}] không tồn tại!");
            }
        }

        if (!method_exists($this, $this->_action)) {
            if (method_exists($this, 'view')) {
                $this->_action = 'view';
            } else {
                throw new Exception("Action [{$action}] trên đối tượng [{$this->_controller}] " .
                    "không tồn tại!", 109);
            }
        }
        # Khởi tạo template
        $this->_view = new View($this->_controller, $this->_action);
        $this->View =& $this->_view;
    }

    public function ignoreMasterTemplate()
    {
        $this->_ignoreMaster = true;
    }

    /**
     * Gán 1 cắp $name => $value vào template main hoặc template của controller
     * @param $key string | array
     * @param $value
     * @param bool $wrap true: gán cho template main, false: gán cho template của controller (con bên trong)
     */
    function assign($key, $value = null, $wrap = false)
    {
        $this->_view->assign($key, $value, $wrap);
    }

    public function preRender()
    {
        # Thực hiện load danh sách hãng sản xuất
        $manufactures = Hangsanxuat::getList();
        foreach ($manufactures as &$item) {
            $item['hsx_id'] = $item['hsx_id'] . '-' . str_replace(' ', '_', $item['hsx_ten']);
        }

        $this->assign(array(
            'list_hangsx' => $manufactures
        ), null, true);

        $this->assign('root', ROOT_URL, true);

        # render giỏ hàng
        /*
        ShopCartController::addItem('APP001', 2);

        */

        $this->assign('shopcart', ShopController::getShopCartDetail(), true);
    }


    function __destruct()
    {
        if (!$this->_render) {
            return;
        }

        if ($this->_ignoreMaster) {
            $this->View->ignoreMasterTemplate();
        } else {
            $this->preRender();
        }

        $this->_view->render();
    }
}